// SCRIPT PARA CREAR CLASES JS con HERENCIA
/*
¿Como lo uso?
Con este script podemos generar Clases, pero ¿como?:
var Humano = new Class({
	piernas: 2,
	brazos: 2,
	cabeza: 1,
	init: function(name){
		this.name = name;
	},
	saludar: function(){
		return "Hola, soy " + this.name;
	}
});
Creamos la Clase Humano que especifica tiene 2 piernas, 2 brazos y una cabeza, además especificamos que el constructor nos solicita un nombre que se le asignará al “Humano“. Como método para testear que funciona he creado saludar() que nos devolverá un saludo cordial personalizado para cada “Humano“.
var Programador = new Class({
	experiencia: 0,
	init: function(name, lenguaje){
		this.parent(name);
		this.lenguaje = lenguaje;
	},
	saludar: function(){
		return this.parent() + " y programo en " + this.lenguaje;
	},
	programar: function(){
		this.experiencia++;
		return "Estoy programando";
	}
},Humano);
La clase Programador extiende de la clase Humano y además le añade experiencia como un valor único de los Programadores. Sobreescribimos los métodos init() y saludar() pero hacemos referencia a los del padre (Class Humano) mediante el uso de this.parent(). Además he añadido un método propio del Programador que obviamente es “programar()”
var Andres = new Programador("Andres", "Javascript");
Andres.saludar();
// --> "Hola, soy Andres y programo en Javascript"
De esta forma creamos un nuevo Objeto llamado Andres y que dispondrá de todos los métodos de Humano y Programador.
*/

MyClass = function(current,previous){
// Comprobamos si tenemos una Class que extender.
      previous = typeof previous == 'undefined' ? {} : previous.prototype;
  // Extendemos con las propiedades de la Class anterior
      for(p in previous){
	// Si no existe la propiedad la añadimos
            if(typeof current[p] == 'undefined') current[p] = previous[p];
	// Si es una función
            else if(typeof previous[p] == 'function'){
	      // añadimos this.parent() a la función de la Class actual.
                  current[p] = (function(tmp){
                                var _parent = function(){
                                    this.parent = _parent.parent;
                                    return tmp.apply(this, arguments);
                                    }
                                    return _parent;
                                })(current[p]);
	// Igualamos this.parent() al método de la Class anterior.
                current[p].parent = previous[p];
            }
        }
	// Construimos el contenedor
        var construct = function(){
          if(this.init) this.init.apply(this,arguments);
        }
	// Le aplicamos los métodos extendidos
        construct.prototype = current;
	// asignamos un constructor
        construct.constructor = MyClass;
	//Devolvemos el constructor.
        return construct;
    };